головне меню список тем тестування презентації історія створення

 

3.4. Система команд процесора

В загальному випадку система команд процесора включає наступні чотири основні групи команд:

  • команди пересилки даних;
  • арифметичні команди;
  • логічні команди;
  • команди переходів.

Команди пересилки даних не вимагають виконання ніяких операцій над операндами. Операнди просто пересилаються (точніше, копіюються) з джерела (Source) в приймач (Destination). Джерелом і приймачем можуть бути внутрішні регістри процесора, елемента пам'яті або пристрою вводу/виводу. АЛП в даному випадку не використовується.
Арифметичні команди виконують операції додавання, віднімання, множення, ділення, збільшення на одиницю (інкрементування), зменшення на одиницю (декрементування) і т.д. Цим командам потрібні один або два вхідні операнди. Формують команди один вихідний операнд.
Логічні команди проводять над операндами логічні операції, наприклад, логічне І, логічне АБО, виключаюче АБО, очищення, інверсію, різноманітні зсуви (вправо, вліво, арифметичний зсув, циклічний зсув). Цим командам, як і арифметичним, потрібні один або два вхідні операнди, і формують вони один вихідний операнд.
Нарешті, команди переходів призначені для зміни звичайного порядку послідовного виконання команд. З їх допомогою організовуються переходи на підпрограми і повернення з них, всілякі цикли, розгалуження програм, пропуски фрагментів програм і т.д. Команди переходів завжди міняють вміст лічильника команд. Переходи можуть бути умовними і безумовними. Саме ці команди дозволяють будувати складні алгоритми обробки інформації.
Відповідно до результату кожної виконаної команди встановлюються або очищаються біти регістра стану процесора (PSW). Але треба пам'ятати, що не всі команди змінюють прапори PSW. Це визначається особливостями кожного конкретного процесора.
У різних процесорів системи команд істотно розрізняються, але в основі своїй вони дуже схожі. Кількість команд у процесорів також різна. Наприклад, у згадуваного вже процесора МС68000 всього 61 команда, а у процесора 8086 - 133 команди. У сучасних могутніх процесорів кількість команд досягає декількох сотень. В той же час існують процесори з скороченим набором команд (так звані RISC-процесори), в яких за рахунок максимального скорочення кількості команд досягається збільшення ефективності і швидкості їх виконання.
Розглянемо тепер особливості чотирьох виділених груп команд процесора більш детально.

3.4.1. Команди пересилки даних

Команди пересилки даних займають дуже важливе місце в системі команд будь-якого процесора. Вони виконують наступні найважливіші функції:

  • завантаження (запис) вмісту у внутрішні регістри процесора;
  • збереження в пам'яті вмісту внутрішніх регістрів процесора;
  • копіювання вмісту з однієї області пам'яті в іншу;
  • запис в пристрої вводу/виводу і читання з пристроїв вводу/виводу.

В деяких процесорах (наприклад, Т-11) всі ці функції виконуються однією єдиною командою MOV (для байтових пересилок - MOVB) але з різними методами адресації операндів.
В інших процесорах крім команди MOV є ще декілька команд для виконання перерахованих функцій. Наприклад, для завантаження регістрів можуть використовуватися команди завантаження, причому для різних регістрів - різні команди (їх позначення звичайно будуються з використанням слова LOAD - завантаження). Часто виділяються спеціальні команди для збереження в стеку і для витягання із стека (PUSH - зберегти в стеку, POP - витягнути із стека). Ці команди виконують пересилку з автоінкрементної і з автодекрементної адресацієї (навіть якщо ці режими адресації не передбачені в процесорі в явному вигляді).
Іноді в систему команд вводиться спеціальна команда MOVS для рядкової (або ланцюгової) пересилки даних (наприклад, в процесорі 8086). Ця команда пересилає не одне слово або байт, а задану кількість слів або байт (MOVSB), тобто ініціює не один цикл обміну по магістралі, а кілька. При цьому адреса пам'яті, з якою відбувається взаємодія, збільшується на 1 або на 2 після кожного звернення або ж зменшується на 1 або на 2 після кожного звернення. Тобто в неявному вигляді застосовується автоінкремента або автодекремента адресація.
В деяких процесорах (наприклад, в процесорі 8086) спеціально виділяються функції обміну з пристроями вводу/виводу. Команда IN використовується для введення (читання) інформації з пристрою вводу/виводу, а команда OUT використовується для виводу (запису) в пристрій вводу/виводу. Обмін інформацією в цьому випадку проводиться між регістром-акумулятором і пристроєм вводу/виводу. В більш сучасних процесорах цього ж сімейства (починаючи з процесора  80286) додані команди рядкового (ланцюгового) введення (команда INS) і рядкового виводу (команда OUTS). Ці команди дозволяють пересилати цілий масив (рядок) даних з пам'яті в пристрій вводу/виводу або з пристрою вводу/виводу в пам'ять (INS). Адреса пам'яті після кожного обігу збільшується або зменшується #@:.
Також до команд пересилки даних відносяться команди обміну інформацією (їх позначення будується на основі слова Exchange). Може бути передбачений обмін інформацією між внутрішніми регістрами, між двома половинами одного регістра (SWAP) або між регістром і елементом пам'яті.


3.4.2. Арифметичні команди

Арифметичні команди розглядають коди операндів як числові двійкові або двійково-десяткові коди. Ці команди можуть бути розділені на п'ять основних груп:

  • команди операцій з фіксованою комою (додавання, віднімання, множення, ділення);
  • команди операцій з плаваючою комою (додавання, віднімання, множення, ділення);
  • команди очищення;
  • команди інкремента і декремента;
  • команда порівняння.

Команди операцій з фіксованою комою працюють з кодами в регістрах процесора або в пам'яті як із звичайними двійковими кодами. Команда додавання (ADD) обчислює суму двох кодів. Команда віднімання (SUB) обчислює різницю двох кодів. Команда множення (MUL) обчислює додуток двох кодів (розрядність результату удвічі більша розрядності множників). Команда ділення (DIV) обчислює частку від ділення одного коду на іншій. Причому всі ці команди можуть працювати як з числами із знаком, так і з числами без знака.
Команди операцій з плаваючою комою (крапкою) використовують формат представлення чисел з порядком і мантисою (звичайно ці числа займають два послідовні елементів пам'яті). В сучасних процесорах набір команд з плаваючою комою не обмежується тільки чотирма арифметичними діями, а містить безліч інших складніших команд, наприклад, обчислення тригонометричних функцій, логарифмічних функцій, а також складних функцій, необхідних при обробці звуку і зображення.
Команди очищення (CLR) призначені для запису нульового коду в регістр або елемент пам'яті. Ці команди можуть бути замінені командами пересилки нульового коду, але спеціальні команди очищення звичайно виконуються швидше, ніж команди пересилки. Команди очищення іноді відносять до групи логічних команд, але суть їх від цього не міняється.
Команди інкремента (збільшення на одиницю, INC) і декремента (зменшення на одиницю, DEC) також дуже зручні. Їх можна у принципі замінити командами підсумовування з одиницею або віднімання одиниці, але інкремент і декремент виконуються швидше, ніж підсумовування і віднімання. Ці команди вимагають одного вхідного операнда, який одночасно є і вихідним операндом.
Нарешті, команда порівняння (позначається CMP) призначена для порівняння двох вхідних операндів. По суті, вона обчислює різницю цих двох операндів, але вихідного операнда не формує, а всього лише змінює біти в регістрі стану процесора (PSW) по результату цього віднімання. Наступна за командою порівняння команда (звичайно це команда переходу) аналізуватиме біти в регістрі стану процесора і виконуватиме дії залежно від їх значень (про команди переходу йдеться в розділі 3.4.4). В деяких процесорах передбачені команди ланцюгового порівняння двох послідовностей операндів, що знаходяться в пам'яті (наприклад, в процесорі 8086 і сумісних з ним).


3.4.3. Логічні команди

Логічні команди виконують над операндами логічні (побітові) операції, тобто вони розглядають коди операндів не як єдине число, а як набір окремих бітів. Цим вони відрізняються від арифметичних команд. Логічні команди виконують наступні основні операції:

  • логічне І, логічне АБО, складання по модулю 2 (виключаюче АБО);
  • логічні, арифметичні і циклічні зсуви;
  • перевірка бітів і операндів;
  • установка і очищення бітів (прапорів) регістра стану процесора (PSW).

Команди логічних операцій дозволяють побітно обчислювати основні логічні функції від двох вхідних операндів. Крім того, операція І (AND) використовується для примусового очищення заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають очищення, встановлені в нуль). Операція АБО (OR) застосовується для примусової установки заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають установки в одиницю, рівні одиниці). Операція « виключаюче  АБО» (XOR) використовується для інверсії заданих бітів (як один з операндів при цьому застосовується код маски, в якому біти, що підлягають інверсії, встановлені в одиницю). Команди вимагають двох вхідних операндів і формують один вихідний операнд.
Команди зсувів дозволяють побітно зсовувати код операнда управо (убік молодших розрядів) або вліво (у бік старших розрядів). Тип зсуву (логічний, арифметичний або циклічний) визначає, яке буде нове значення старшого біта (при зсуві управо) або молодшого біта (при зсуві вліво), а також визначає, чи буде десь збережено попереднє значення старшого біта (при зсуві вліво) або молодшого біта (при зсуві управо). Наприклад, при логічному зсуві управо в старшому розряді коду операнда встановлюється нуль, а молодший розряд записується як прапор перенесення в регістр стану процесора. А при арифметичному зсуві управо значення старшого розряду зберігається колишнім (нулем або одиницею), молодший розряд також записується як прапор перенесення.
Циклічні зсуви дозволяють зсовувати біти коду операнда по кругу (за годинниковою стрілкою при зсуві управо або проти годинникової стрілки при зсуві вліво). При цьому в кільце зсуву може входити або не входити прапор перенесення. В біт прапора перенесення (якщо він використовується) записується значення старшого біта при циклічному зсуві вліво і молодшого біта при циклічному зсуві управо. Відповідно, значення біта прапора перенесення переписуватиметься в молодший розряд при циклічному зсуві вліво і в старший розряд при циклічному зсуві управо.
Для прикладу на мал. 3.12 показані дії, виконувані командами зсувів управо.
Команди перевірки бітів і операндів призначені для установки або очищення бітів регістра стану процесора залежно від значення вибраних бітів або всього операнда в цілому. Вихідного операнда команди не формують. Команда перевірки операнда (TST) перевіряє весь код операнда в цілому на рівність нулю і на знак (на значення старшого біта), вона вимагає тільки одного вхідного операнда. Команда перевірки біта (BIT) перевіряє тільки окремі біти, для вибору яких як другий операнд використовується код маски. В коді маски бітам основного операнда, що перевіряються, винні відповідати одиничні розряди.


Мал. 3.12. Команди зсувів управо.

Нарешті, команди установки і очищення бітів регістра стану процесора (тобто прапорів) дозволяють встановити або очистити будь-який прапор, що дуже зручно. Кожному прапору звичайно відповідають дві команди, одна з яких встановлює його в одиницю, а інша скидає в нуль. Наприклад, прапору перенесення С (від Carry) відповідатимуть команди CLC (очищення) і SEC або STC (установка).


3.4.4. Команди переходів

Команди переходів призначені для організації всіляких циклів, розгалужень, викликів підпрограм і т.д., тобто вони порушують послідовний хід виконання програми. Ці команди записують в регістр-лічильник команд нове значення і тим самим викликають перехід процесора не до наступної по порядку команди, а до будь-якої іншої команди в пам'яті програм. Деякі команди переходів передбачають надалі повернення назад, в точку, з якої був зроблений перехід, інші не передбачають цього. Якщо повернення передбачено, то поточні параметри процесора зберігаються в стеку. Якщо повернення не передбачено, то поточні параметри процесора не зберігаються.
Команди переходів без повернення діляться на дві групи:

  • команди безумовних переходів;
  • команди умовних переходів.

В позначеннях цих команд використовуються слова Branch (галуження) і Jump (стрибок).
Команди безумовних переходів викликають перехід на нову адресу незалежно ні від чого. Вони можуть викликати перехід на вказану величину зсуву (вперед або назад) або ж на вказану адресу пам'яті. Величина зсуву або нове значення адреси указуються як вхідний операнд.
Команди умовних переходів викликають перехід не завжди, а тільки при виконанні заданих умов. Як такі умови звичайно виступають значення прапорів в регістрі стану процесора (PSW). Тобто умовою переходу є результат попередньої операції, що міняє значення прапорів. Всього таких умов переходу може бути від 4 до 16. Декілька прикладів команд умовних переходів:

  • перехід, якщо рівно нулю;
  • перехід, якщо не рівно нулю;
  • перехід, якщо є переповнювання;
  • перехід, якщо немає переповнювання;
  • перехід, якщо більше нуля;
  • перехід, якщо менше або рівно нулю.

Якщо умова переходу виконується, то проводиться завантаження в регістр-лічильник команд нового значення. Якщо ж умова переходу не виконується, лічильник команд просто нарощується, і процесор вибирає і виконує наступну по порядку команду.
Спеціально для перевірки умов переходу застосовується команда порівняння (CMP), передуюча команді умовного переходу (або навіть декільком командам умовних переходів). Але прапори можуть встановлюватися і будь-якою іншою командою, наприклад командою пересилки даних, будь-якою арифметичною або логічною командою. Відзначимо, що самі команди переходів прапори не міняють, що якраз і дозволяє ставити декілька команд переходів одну за іншою.
Сумісне використовування декількох команд умовних і безумовних переходів дозволяє процесору виконувати розгалужені алгоритми будь-якої складності. Для прикладу на мал. 3.13 показано розгалуження програми на дві вітки з подальшим з'єднанням, а на мал. 3.14 - розгалуження на три вітки з подальшим з'єднанням.
Команди переходів з подальшим поверненням в точку, з якої був проведений перехід, застосовуються для виконання підпрограм, тобто допоміжних програм. Ці команди називаються також командами виклику підпрограм (поширена назва - CALL). Використовування підпрограм дозволяє спростити структуру основної програми, зробити її більш логічною, гнучкою, легкою для написання і відладки. В той же час треба враховувати, що широке використовування підпрограм, як правило, збільшує час виконання програми.

 

 



Мал. 3.13. Реалізація розгалуження на дві вітки.

Мал. 3.14. Реалізація розгалуження на три вітки.

Всі команди переходів з поверненням припускають безумовний перехід (вони не перевіряють ніяких прапорів). При цьому вони вимагають одного вхідного операнда, який може вказуватися як абсолютне значення нової адреси, так і зсув, що складається з поточним значенням адреси. Поточне значення лічильника команд (поточна адреса) зберігається перед виконанням переходу в стеку.
Для зворотного повернення в точку виклику підпрограми (точку переходу) використовується спеціальна команда повернення (RET або RTS). Ця команда витягує із стека значення адреси команди переходу і записує його в регістр-лічильник команд.
Особливе місце серед команд переходу з поверненням займають команди переривань (поширена назва - INT). Ці команди як вхідний операнд вимагають номер переривання (адреса вектора). Обслуговування таких переходів здійснюється точно так, як і апаратних переривань. Тобто для виконання даного переходу процесор звертається до таблиці векторів переривань і одержує з неї по номеру переривання адресу пам'яті, в яку йому необхідно перейти. Адреса виклику переривання і вміст регістра стану процесора (PSW) зберігаються в стеку. Збереження PSW - важлива відмінність команд переривання від команд переходів з поверненням.
Команди переривань у багатьох випадках виявляються зручніше, ніж звичайні команди переходів з поверненням. Сформувати таблицю векторів переривань можна один раз, а потім вже звертатися до неї в міру необхідності. Номер переривання відповідає номеру підпрограми, тобто номеру функції, виконуваною підпрограмою. Тому команди переривання набагато частіше включаються в системи команд процесорів, ніж звичайні команди переходів з поверненням.
Для повернення з підпрограми, викликаною командою переривання, використовується команда повернення з переривання (IRET або RTI). Ця команда витягує із стека збережене там значення лічильника команд і регістра стану процесора (PSW).
Відзначимо, що у деяких процесорів передбачені також команди умовних переривань, наприклад, команда переривання при переповнюванні.
Звичайно, в даному розділі ми розглянули тільки основні команди, найбільш часто що зустрічаються в процесорах. У конкретних процесорів можуть бути і багато інших команди, що не відносяться до перерахованих груп команд. Але вивчати їх треба вже після того, як вибраний тип процесора, відповідний для задачі, вирішуваною даною мікропроцесорною системою.

 

 

попередня тема наступна тема